package com.itheima.admin.gateway.util;

import io.jsonwebtoken.*;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.List;

/**
 * JWT工具类（管理端网关专用 - 最新版本）
 * 支持管理员Token解析，包含角色和权限
 * 
 * @author itheima
 */
public class JwtUtil {

    // 加密密钥（与auth-service保持一致）
    private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjYxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTA=";

    /**
     * 解析Token（低版本JJWT兼容）
     */
    private static Jws<Claims> parseToken(String token) throws JwtException {
        return Jwts.parser()
                .setSigningKey(generalKey())
                .parseClaimsJws(token);
    }

    /**
     * 获取Token中的Claims
     */
    public static Claims getClaims(String token) {
        try {
            return parseToken(token).getBody();
        } catch (ExpiredJwtException e) {
            // 即使过期也返回Claims（用于判断是否可刷新）
            return e.getClaims();
        } catch (JwtException e) {
            return null;
        }
    }

    /**
     * 验证Token是否有效（未过期）
     */
    public static boolean validateToken(String token) {
        try {
            Jws<Claims> claimsJws = parseToken(token);
            Claims claims = claimsJws.getBody();
            Date expiration = claims.getExpiration();
            return expiration != null && expiration.after(new Date());
        } catch (ExpiredJwtException e) {
            return false;  // 已过期
        } catch (JwtException e) {
            return false;  // 无效token
        }
    }

    /**
     * 获取用户ID（支持Long和Integer）
     */
    public static Integer getUserId(String token) {
        Claims claims = getClaims(token);
        if (claims == null) {
            return null;
        }
        Object id = claims.get("id");
        if (id instanceof Integer) {
            return (Integer) id;
        } else if (id instanceof Long) {
            return ((Long) id).intValue();
        }
        return null;
    }

    /**
     * 获取用户类型（MP_USER 或 ADMIN）
     */
    public static String getUserType(String token) {
        Claims claims = getClaims(token);
        if (claims == null) {
            return null;
        }
        return (String) claims.get("userType");
    }

    /**
     * 判断是否为管理员
     */
    public static boolean isAdmin(String token) {
        return "ADMIN".equals(getUserType(token));
    }

    /**
     * 获取用户名（管理员专用）
     */
    public static String getUsername(String token) {
        Claims claims = getClaims(token);
        if (claims == null) {
            return null;
        }
        return (String) claims.get("username");
    }

    /**
     * 获取昵称
     */
    public static String getNickname(String token) {
        Claims claims = getClaims(token);
        if (claims == null) {
            return null;
        }
        return (String) claims.get("nickname");
    }

    /**
     * 获取角色列表（管理员专用）
     */
    @SuppressWarnings("unchecked")
    public static List<String> getRoles(String token) {
        Claims claims = getClaims(token);
        if (claims == null) {
            return null;
        }
        return (List<String>) claims.get("roles");
    }

    /**
     * 获取权限列表（管理员专用）
     */
    @SuppressWarnings("unchecked")
    public static List<String> getPermissions(String token) {
        Claims claims = getClaims(token);
        if (claims == null) {
            return null;
        }
        return (List<String>) claims.get("permissions");
    }

    /**
     * 生成密钥
     */
    private static byte[] generalKey() {
        return TOKEN_ENCRY_KEY.getBytes(StandardCharsets.UTF_8);
    }
}

